package com.awg.filter;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * 自定义Shiro过滤器（本过滤器是一个与授权相关的过滤器），当传入多个角色时，只需要满足任一个即可。
 *              <br> 与认证相关的需要继承 AuthenticationFilter；
 *              <br> 与授权相关的需要继承 AuthorizationFilter。
 * @author awg
 * @date 2020-02-24
 * @version 1.0
 */
public class RolesOrOneFilter extends AuthorizationFilter {

	/**
	 * 当传入多个角色时，只需要满足任一个即可
	 *
	 * @param servletRequest 请求对象
	 * @param servletResponse 响应对象
	 * @param o 自定义的角色（数组）
	 * @return 是否是许可的角色的结果
	 */
	@Override
	protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) {
		// 获取主体信息
		Subject subject = getSubject(servletRequest, servletResponse);
		// 获取自定义的角色数组
		String[] roles = (String[]) o;
		// 当角色数组为空时，说明该资源是可以访问的（不需要经过授权）
		if (roles == null || roles.length == 0) {
			return true;
		}
		// 若角色数组不为空，则需要判断：只要当前主体只要包含任一个指定的角色就允许访问
		for (String role : roles) {
			if (subject.hasRole(role)) {
				return true;
			}
		}
		return false;
	}
}
